package com.lesserpand.rabbitmq.redis.service;

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class RedissonSkillService {

    @Autowired
    private RedissonClient redissonClient;

    /***
     * 抢购代码
     * @param redisTemplate
     * @return
     */
    public String seckill(StringRedisTemplate redisTemplate) {
        // 设置锁
        RLock lock = redissonClient.getLock("anyLock");
        try {
            // 加锁
            lock.lock();
            String returnMsg;

            // 需要加锁的代码
            String pronum = redisTemplate.opsForValue().get("pronum");

            //修改库存
            if (null == pronum) {
                System.out.println("手慢没抢到" + Thread.currentThread().getName());
                returnMsg = "手慢没抢到" + Thread.currentThread().getName();
            } else {
                if (Integer.parseInt(pronum) - 1 >= 0) {
                    redisTemplate.opsForValue().set("pronum", String.valueOf(Integer.parseInt(pronum) - 1));
                    System.out.println("库存数量:" + pronum + "     成功!!!" + Thread.currentThread().getName());
                    returnMsg = "库存数量:" + pronum + "     成功!!!" + Thread.currentThread().getName();
                } else {
                    System.out.println("手慢没抢到" + Thread.currentThread().getName());
                    returnMsg = "手慢没抢到" + Thread.currentThread().getName();
                }
            }

            return returnMsg;

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 为了让分布式锁的算法更稳键些，持有锁的客户端在解锁之前应该再检查一次自己的锁是否已经超时，再去做DEL操作，因为可能客户端因为某个耗时的操作而挂起，
            // 操作完的时候锁因为超时已经被别人获得，这时就不必解锁了。 ————这里没有做
            lock.unlock();
        }
        return "手慢没抢到 + Thread.currentThread().getName()";
    }
}
